๋ ๊ฑฐ์ ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋๋ฅผ ์ต์ ๋ชจ๋ ์์คํ (ES ๋ชจ๋, CommonJS, AMD)์ผ๋ก ๋ง์ด๊ทธ๋ ์ด์ ํ๊ธฐ ์ํ ์ ๋ต, ๋๊ตฌ ๋ฐ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ๋ค๋ฃจ๋ ์ข ํฉ ๊ฐ์ด๋์ ๋๋ค.
์๋ฐ์คํฌ๋ฆฝํธ ๋ชจ๋ ๋ง์ด๊ทธ๋ ์ด์ : ๋ ๊ฑฐ์ ์ฝ๋ ํ๋ํ ์ ๋ต
ํ๋ ์๋ฐ์คํฌ๋ฆฝํธ ๊ฐ๋ฐ์ ๋ชจ๋์ฑ์ ํฌ๊ฒ ์์กดํฉ๋๋ค. ๋๊ท๋ชจ ์ฝ๋๋ฒ ์ด์ค๋ฅผ ๋ ์๊ณ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ๋ฉฐ ์ ์ง๋ณด์ํ๊ธฐ ์ฌ์ด ๋ชจ๋๋ก ๋๋๋ ๊ฒ์ ํ์ฅ ๊ฐ๋ฅํ๊ณ ๊ฒฌ๊ณ ํ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ๋ ๋ฐ ๋งค์ฐ ์ค์ํฉ๋๋ค. ํ์ง๋ง ๋ง์ ๋ ๊ฑฐ์ ์๋ฐ์คํฌ๋ฆฝํธ ํ๋ก์ ํธ๋ ES ๋ชจ๋(ESM), CommonJS(CJS), ๋น๋๊ธฐ ๋ชจ๋ ์ ์(AMD)์ ๊ฐ์ ํ๋์ ์ธ ๋ชจ๋ ์์คํ ์ด ๋ณดํธํ๋๊ธฐ ์ ์ ์์ฑ๋์์ต๋๋ค. ์ด ๊ธ์ ์ ์ธ๊ณ ํ๋ก์ ํธ์ ์ ์ฉํ ์ ์๋ ์ ๋ต, ๋๊ตฌ, ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ๋ค๋ฃจ๋ฉฐ ๋ ๊ฑฐ์ ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋๋ฅผ ํ๋์ ์ธ ๋ชจ๋ ์์คํ ์ผ๋ก ๋ง์ด๊ทธ๋ ์ด์ ํ๊ธฐ ์ํ ํฌ๊ด์ ์ธ ๊ฐ์ด๋๋ฅผ ์ ๊ณตํฉ๋๋ค.
์ต์ ๋ชจ๋๋ก ๋ง์ด๊ทธ๋ ์ด์ ํด์ผ ํ๋ ์ด์
์ต์ ๋ชจ๋ ์์คํ ์ผ๋ก ๋ง์ด๊ทธ๋ ์ด์ ํ๋ฉด ์๋ง์ ์ด์ ์ ์ป์ ์ ์์ต๋๋ค:
- ํฅ์๋ ์ฝ๋ ๊ตฌ์ฑ: ๋ชจ๋์ ๊ด์ฌ์ฌ์ ๋ช ํํ ๋ถ๋ฆฌ๋ฅผ ์ด์งํ์ฌ ์ฝ๋๋ฅผ ๋ ์ฝ๊ฒ ์ดํดํ๊ณ , ์ ์ง๋ณด์ํ๊ณ , ๋๋ฒ๊น ํ ์ ์๊ฒ ๋ง๋ญ๋๋ค. ์ด๋ ํนํ ํฌ๊ณ ๋ณต์กํ ํ๋ก์ ํธ์ ์ ์ฉํฉ๋๋ค.
- ์ฝ๋ ์ฌ์ฌ์ฉ์ฑ: ๋ชจ๋์ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฌ๋ฌ ๋ถ๋ถ์ด๋ ๋ค๋ฅธ ํ๋ก์ ํธ์์๋ ์ฝ๊ฒ ์ฌ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ด๋ ์ฝ๋ ์ค๋ณต์ ์ค์ด๊ณ ์ผ๊ด์ฑ์ ์ด์งํฉ๋๋ค.
- ์์กด์ฑ ๊ด๋ฆฌ: ์ต์ ๋ชจ๋ ์์คํ ์ ์์กด์ฑ์ ๋ช ์์ ์ผ๋ก ์ ์ธํ๋ ๋ฉ์ปค๋์ฆ์ ์ ๊ณตํ์ฌ ์ด๋ค ๋ชจ๋์ด ์๋ก ์์กดํ๋์ง ๋ช ํํ๊ฒ ํฉ๋๋ค. npm์ด๋ yarn๊ณผ ๊ฐ์ ๋๊ตฌ๋ ์์กด์ฑ ์ค์น ๋ฐ ๊ด๋ฆฌ๋ฅผ ๋จ์ํํฉ๋๋ค.
- ๋ฐ๋ ์ฝ๋ ์ ๊ฑฐ(ํธ๋ฆฌ ์์ดํน): Webpack์ด๋ Rollup๊ณผ ๊ฐ์ ๋ชจ๋ ๋ฒ๋ค๋ฌ๋ ์ฝ๋๋ฅผ ๋ถ์ํ๊ณ ์ฌ์ฉ๋์ง ์๋ ์ฝ๋(ํธ๋ฆฌ ์์ดํน)๋ฅผ ์ ๊ฑฐํ์ฌ ๋ ์๊ณ ๋น ๋ฅธ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ง๋ญ๋๋ค.
- ์ฑ๋ฅ ํฅ์: ๋ชจ๋์ ํตํด ๊ฐ๋ฅํ ๊ธฐ์ ์ธ ์ฝ๋ ๋ถํ (code splitting)์ ์ฌ์ฉํ๋ฉด ํน์ ํ์ด์ง๋ ๊ธฐ๋ฅ์ ํ์ํ ์ฝ๋๋ง ๋ก๋ํ ์ ์์ด ์ด๊ธฐ ๋ก๋ ์๊ฐ๊ณผ ์ ๋ฐ์ ์ธ ์ ํ๋ฆฌ์ผ์ด์ ์ฑ๋ฅ์ ๊ฐ์ ํ ์ ์์ต๋๋ค.
- ํฅ์๋ ์ ์ง๋ณด์์ฑ: ๋ชจ๋์ ๋ฒ๊ทธ๋ฅผ ๊ฒฉ๋ฆฌํ๊ณ ์์ ํ๊ธฐ ์ฝ๊ฒ ๋ง๋ค ๋ฟ๋ง ์๋๋ผ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ค๋ฅธ ๋ถ๋ถ์ ์ํฅ์ ์ฃผ์ง ์๊ณ ์๋ก์ด ๊ธฐ๋ฅ์ ์ถ๊ฐํ๊ธฐ ์ฝ๊ฒ ๋ง๋ญ๋๋ค. ๋ฆฌํฉํ ๋ง์ด ๋ ์ํํด์ง๊ณ ๊ด๋ฆฌํ๊ธฐ ์ฌ์์ง๋๋ค.
- ๋ฏธ๋ ๋๋น: ์ต์ ๋ชจ๋ ์์คํ ์ ์๋ฐ์คํฌ๋ฆฝํธ ๊ฐ๋ฐ์ ํ์ค์ ๋๋ค. ์ฝ๋๋ฅผ ๋ง์ด๊ทธ๋ ์ด์ ํ๋ฉด ์ต์ ๋๊ตฌ ๋ฐ ํ๋ ์์ํฌ์์ ํธํ์ฑ์ ์ ์งํ ์ ์์ต๋๋ค.
๋ชจ๋ ์์คํ ์ดํดํ๊ธฐ
๋ง์ด๊ทธ๋ ์ด์ ์ ์์ํ๊ธฐ ์ ์ ์ฌ๋ฌ ๋ค๋ฅธ ๋ชจ๋ ์์คํ ์ ์ดํดํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค:
ES ๋ชจ๋ (ESM)
ES ๋ชจ๋์ ECMAScript 2015(ES6)์์ ๋์
๋ ์๋ฐ์คํฌ๋ฆฝํธ ๋ชจ๋์ ๊ณต์ ํ์ค์
๋๋ค. import์ export ํค์๋๋ฅผ ์ฌ์ฉํ์ฌ ์์กด์ฑ์ ์ ์ํ๊ณ ๊ธฐ๋ฅ์ ๋
ธ์ถํฉ๋๋ค.
// myModule.js
export function myFunction() {
// ...
}
// main.js
import { myFunction } from './myModule.js';
myFunction();
ESM์ ์ต์ ๋ธ๋ผ์ฐ์ ์ Node.js(v13.2๋ถํฐ --experimental-modules ํ๋๊ทธ์ ํจ๊ป, v14๋ถํฐ๋ ํ๋๊ทธ ์์ด ์๋ฒฝํ๊ฒ ์ง์)์์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ง์๋ฉ๋๋ค.
CommonJS (CJS)
CommonJS๋ ์ฃผ๋ก Node.js์์ ์ฌ์ฉ๋๋ ๋ชจ๋ ์์คํ
์
๋๋ค. require ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ๋ชจ๋์ ๊ฐ์ ธ์ค๊ณ module.exports ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ์ฌ ๊ธฐ๋ฅ์ ๋ด๋ณด๋
๋๋ค.
// myModule.js
module.exports = {
myFunction: function() {
// ...
}
};
// main.js
const myModule = require('./myModule');
myModule.myFunction();
๋ธ๋ผ์ฐ์ ์์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ง์๋์ง๋ ์์ง๋ง, CommonJS ๋ชจ๋์ Browserify๋ Webpack๊ณผ ๊ฐ์ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ฌ ๋ธ๋ผ์ฐ์ ์ฉ์ผ๋ก ๋ฒ๋ค๋งํ ์ ์์ต๋๋ค.
๋น๋๊ธฐ ๋ชจ๋ ์ ์ (AMD)
AMD๋ ์ฃผ๋ก ๋ธ๋ผ์ฐ์ ์์ ์ฌ์ฉ๋๋ ๋น๋๊ธฐ ๋ชจ๋ ๋ก๋ฉ์ ์ํด ์ค๊ณ๋ ๋ชจ๋ ์์คํ
์
๋๋ค. define ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ๋ชจ๋๊ณผ ๊ทธ ์์กด์ฑ์ ์ ์ํฉ๋๋ค.
// myModule.js
define(function() {
return {
myFunction: function() {
// ...
}
};
});
// main.js
require(['./myModule'], function(myModule) {
myModule.myFunction();
});
RequireJS๋ AMD ์ฌ์์ ์ธ๊ธฐ ์๋ ๊ตฌํ์ฒด์ ๋๋ค.
๋ง์ด๊ทธ๋ ์ด์ ์ ๋ต
๋ ๊ฑฐ์ ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋๋ฅผ ์ต์ ๋ชจ๋๋ก ๋ง์ด๊ทธ๋ ์ด์ ํ๋ ๋ฐ์๋ ์ฌ๋ฌ ์ ๋ต์ด ์์ต๋๋ค. ์ต์์ ์ ๊ทผ ๋ฐฉ์์ ์ฝ๋๋ฒ ์ด์ค์ ํฌ๊ธฐ์ ๋ณต์ก์ฑ, ๊ทธ๋ฆฌ๊ณ ์ํ ๊ฐ์ ์์ค์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋๋ค.
1. "๋น ๋ฑ " ๋ฐฉ์์ ์ ๋ฉด ์ฌ์์ฑ
์ด ์ ๊ทผ ๋ฐฉ์์ ์ฒ์๋ถํฐ ์ต์ ๋ชจ๋ ์์คํ ์ ์ฌ์ฉํ์ฌ ์ ์ฒด ์ฝ๋๋ฒ ์ด์ค๋ฅผ ์ฒ์๋ถํฐ ๋ค์ ์์ฑํ๋ ๊ฒ์ ํฌํจํฉ๋๋ค. ์ด๋ ๊ฐ์ฅ ํ๊ดด์ ์ธ ์ ๊ทผ ๋ฐฉ์์ด๋ฉฐ ๊ฐ์ฅ ๋์ ์ํ์ ์๋ฐํ์ง๋ง, ์๋นํ ๊ธฐ์ ๋ถ์ฑ๊ฐ ์๋ ์ค์ ๊ท๋ชจ ํ๋ก์ ํธ์๋ ๊ฐ์ฅ ํจ๊ณผ์ ์ผ ์ ์์ต๋๋ค.
์ฅ์ :
- ๊นจ๋ํ ์์: ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ์ฌ์ฉํ์ฌ ์ ํ๋ฆฌ์ผ์ด์ ์ํคํ ์ฒ๋ฅผ ์ฒ์๋ถํฐ ์ค๊ณํ ์ ์์ต๋๋ค.
- ๊ธฐ์ ๋ถ์ฑ ํด๊ฒฐ ๊ธฐํ: ๋ ๊ฑฐ์ ์ฝ๋๋ฅผ ์ ๊ฑฐํ๊ณ ์๋ก์ด ๊ธฐ๋ฅ์ ๋ ํจ์จ์ ์ผ๋ก ๊ตฌํํ ์ ์์ต๋๋ค.
๋จ์ :
- ๋์ ์ํ: ์ฑ๊ณต์ ๋ณด์ฅํ ์ ์์ผ๋ฉฐ ์๋นํ ์๊ฐ๊ณผ ์์ ํฌ์๊ฐ ํ์ํฉ๋๋ค.
- ํ๊ดด์ : ๊ธฐ์กด ์ํฌํ๋ก์ฐ๋ฅผ ๋ฐฉํดํ๊ณ ์๋ก์ด ๋ฒ๊ทธ๋ฅผ ์ ๋ฐํ ์ ์์ต๋๋ค.
- ๋๊ท๋ชจ ํ๋ก์ ํธ์๋ ์คํ ๋ถ๊ฐ๋ฅํ ์ ์์: ๋๊ท๋ชจ ์ฝ๋๋ฒ ์ด์ค๋ฅผ ์ฌ์์ฑํ๋ ๊ฒ์ ์์ฒญ๋ ๋น์ฉ๊ณผ ์๊ฐ์ด ์์๋ ์ ์์ต๋๋ค.
์ฌ์ฉ ์๊ธฐ:
- ์๋นํ ๊ธฐ์ ๋ถ์ฑ๊ฐ ์๋ ์ค์ ๊ท๋ชจ ํ๋ก์ ํธ.
- ๊ธฐ์กด ์ํคํ ์ฒ์ ๊ทผ๋ณธ์ ์ธ ๊ฒฐํจ์ด ์๋ ํ๋ก์ ํธ.
- ์์ ํ ์ฌ์ค๊ณ๊ฐ ํ์ํ ๊ฒฝ์ฐ.
2. ์ ์ง์ ๋ง์ด๊ทธ๋ ์ด์
์ด ์ ๊ทผ ๋ฐฉ์์ ๊ธฐ์กด ์ฝ๋์์ ํธํ์ฑ์ ์ ์งํ๋ฉด์ ์ฝ๋๋ฒ ์ด์ค๋ฅผ ํ ๋ฒ์ ํ๋์ ๋ชจ๋์ฉ ๋ง์ด๊ทธ๋ ์ด์ ํ๋ ๊ฒ์ ํฌํจํฉ๋๋ค. ์ด๋ ๋ ์ ์ง์ ์ด๊ณ ๋ ์ํํ ์ ๊ทผ ๋ฐฉ์์ด์ง๋ง, ๋ ๋ง์ ์๊ฐ์ด ์์๋ ์ ์์ต๋๋ค.
์ฅ์ :
- ๋ฎ์ ์ํ: ์ฝ๋๋ฒ ์ด์ค๋ฅผ ์ ์ง์ ์ผ๋ก ๋ง์ด๊ทธ๋ ์ด์ ํ์ฌ ์ค๋จ๊ณผ ์ํ์ ์ต์ํํ ์ ์์ต๋๋ค.
- ๋ฐ๋ณต์ : ์งํํ๋ฉด์ ๋ง์ด๊ทธ๋ ์ด์ ์ ๋ต์ ํ ์คํธํ๊ณ ๊ฐ์ ํ ์ ์์ต๋๋ค.
- ๊ด๋ฆฌ ์ฉ์ด์ฑ: ๋ง์ด๊ทธ๋ ์ด์ ์ ๋ ์๊ณ ๊ด๋ฆฌํ๊ธฐ ์ฌ์ด ์์ ์ผ๋ก ๋๋๋๋ค.
๋จ์ :
- ์๊ฐ ์์: "๋น ๋ฑ " ์ฌ์์ฑ๋ณด๋ค ๋ ์ค๋ ๊ฑธ๋ฆด ์ ์์ต๋๋ค.
- ์ ์คํ ๊ณํ ํ์: ์ด์ ์ฝ๋์ ์ ์ฝ๋ ๊ฐ์ ํธํ์ฑ์ ๋ณด์ฅํ๊ธฐ ์ํด ๋ง์ด๊ทธ๋ ์ด์ ํ๋ก์ธ์ค๋ฅผ ์ ์คํ๊ฒ ๊ณํํด์ผ ํฉ๋๋ค.
- ๋ณต์กํ ์ ์์: ์ด์ ๋ชจ๋ ์์คํ ๊ณผ ์ ๋ชจ๋ ์์คํ ๊ฐ์ ๊ฒฉ์ฐจ๋ฅผ ๋ฉ์ฐ๊ธฐ ์ํด ์ฌ(shim)์ด๋ ํด๋ฆฌํ(polyfill)์ ์ฌ์ฉํด์ผ ํ ์ ์์ต๋๋ค.
์ฌ์ฉ ์๊ธฐ:
- ํฌ๊ณ ๋ณต์กํ ํ๋ก์ ํธ.
- ์ค๋จ์ ์ต์ํํด์ผ ํ๋ ํ๋ก์ ํธ.
- ์ ์ง์ ์ธ ์ ํ์ด ์ ํธ๋ ๋.
3. ํ์ด๋ธ๋ฆฌ๋ ์ ๊ทผ๋ฒ
์ด ์ ๊ทผ ๋ฐฉ์์ "๋น ๋ฑ " ์ฌ์์ฑ๊ณผ ์ ์ง์ ๋ง์ด๊ทธ๋ ์ด์ ์ ์์๋ฅผ ๊ฒฐํฉํฉ๋๋ค. ์ฝ๋๋ฒ ์ด์ค์ ํน์ ๋ถ๋ถ์ ์ฒ์๋ถํฐ ๋ค์ ์์ฑํ๊ณ , ๋ค๋ฅธ ๋ถ๋ถ์ ์ ์ง์ ์ผ๋ก ๋ง์ด๊ทธ๋ ์ด์ ํ๋ ๊ฒ์ ํฌํจํฉ๋๋ค. ์ด ์ ๊ทผ ๋ฐฉ์์ ์ํ๊ณผ ์๋ ์ฌ์ด์ ์ข์ ์ ์ถฉ์์ด ๋ ์ ์์ต๋๋ค.
์ฅ์ :
- ์ํ๊ณผ ์๋์ ๊ท ํ: ์ฝ๋๋ฒ ์ด์ค์ ๋ค๋ฅธ ๋ถ๋ถ์ ์ ์ง์ ์ผ๋ก ๋ง์ด๊ทธ๋ ์ด์ ํ๋ฉด์ ์ค์ํ ์์ญ์ ์ ์ํ๊ฒ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค.
- ์ ์ฐ์ฑ: ํ๋ก์ ํธ์ ํน์ ์๊ตฌ์ ๋ง๊ฒ ์กฐ์ ํ ์ ์์ต๋๋ค.
๋จ์ :
- ์ ์คํ ๊ณํ ํ์: ์ฝ๋๋ฒ ์ด์ค์ ์ด๋ ๋ถ๋ถ์ ์ฌ์์ฑํ๊ณ ์ด๋ ๋ถ๋ถ์ ๋ง์ด๊ทธ๋ ์ด์ ํ ์ง ์ ์คํ๊ฒ ์๋ณํด์ผ ํฉ๋๋ค.
- ๋ณต์กํ ์ ์์: ์ฝ๋๋ฒ ์ด์ค์ ์ฌ๋ฌ ๋ค๋ฅธ ๋ชจ๋ ์์คํ ์ ๋ํ ๊น์ ์ดํด๊ฐ ํ์ํฉ๋๋ค.
์ฌ์ฉ ์๊ธฐ:
- ๋ ๊ฑฐ์ ์ฝ๋์ ์ต์ ์ฝ๋๊ฐ ํผํฉ๋ ํ๋ก์ ํธ.
- ์ฝ๋๋ฒ ์ด์ค์ ๋๋จธ์ง ๋ถ๋ถ์ ์ ์ง์ ์ผ๋ก ๋ง์ด๊ทธ๋ ์ด์ ํ๋ฉด์ ์ค์ํ ์์ญ์ ์ ์ํ๊ฒ ์ฒ๋ฆฌํด์ผ ํ ๋.
์ ์ง์ ๋ง์ด๊ทธ๋ ์ด์ ์ ์ํ ๋จ๊ณ
์ ์ง์ ๋ง์ด๊ทธ๋ ์ด์ ์ ๊ทผ ๋ฐฉ์์ ์ ํํ๋ค๋ฉด, ๋ค์์ ๋จ๊ณ๋ณ ๊ฐ์ด๋์ ๋๋ค:
- ์ฝ๋๋ฒ ์ด์ค ๋ถ์: ์ฝ๋์ ์ฌ๋ฌ ๋ถ๋ถ ๊ฐ์ ์์กด์ฑ์ ํ์ ํฉ๋๋ค. ์ ๋ฐ์ ์ธ ์ํคํ ์ฒ๋ฅผ ์ดํดํ๊ณ ์ ์ฌ์ ์ธ ๋ฌธ์ ์์ญ์ ์๋ณํฉ๋๋ค. dependency-cruiser์ ๊ฐ์ ๋๊ตฌ๋ ์ฝ๋ ์์กด์ฑ์ ์๊ฐํํ๋ ๋ฐ ๋์์ด ๋ ์ ์์ต๋๋ค. SonarQube์ ๊ฐ์ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ฌ ์ฝ๋ ํ์ง ๋ถ์์ ๊ณ ๋ คํด ๋ณด์ธ์.
- ๋ชจ๋ ์์คํ ์ ํ: ์ฌ์ฉํ ๋ชจ๋ ์์คํ (ESM, CJS ๋๋ AMD)์ ๊ฒฐ์ ํฉ๋๋ค. ์ผ๋ฐ์ ์ผ๋ก ์๋ก์ด ํ๋ก์ ํธ์๋ ESM์ด ๊ถ์ฅ๋์ง๋ง, ์ด๋ฏธ Node.js๋ฅผ ์ฌ์ฉํ๊ณ ์๋ค๋ฉด CJS๊ฐ ๋ ์ ์ ํ ์ ์์ต๋๋ค.
- ๋น๋ ๋๊ตฌ ์ค์ : Webpack, Rollup ๋๋ Parcel๊ณผ ๊ฐ์ ๋น๋ ๋๊ตฌ๋ฅผ ๊ตฌ์ฑํ์ฌ ๋ชจ๋์ ๋ฒ๋ค๋งํฉ๋๋ค. ์ด๋ฅผ ํตํด ๋ชจ๋ ์์คํ ์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ง์ํ์ง ์๋ ํ๊ฒฝ์์๋ ์ต์ ๋ชจ๋ ์์คํ ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
- ๋ชจ๋ ๋ก๋ ๋์ (ํ์ํ ๊ฒฝ์ฐ): ES ๋ชจ๋์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ง์ํ์ง ์๋ ๊ตฌํ ๋ธ๋ผ์ฐ์ ๋ฅผ ๋์์ผ๋ก ํ๋ ๊ฒฝ์ฐ, SystemJS๋ esm.sh์ ๊ฐ์ ๋ชจ๋ ๋ก๋๋ฅผ ์ฌ์ฉํด์ผ ํฉ๋๋ค.
- ๊ธฐ์กด ์ฝ๋ ๋ฆฌํฉํ ๋ง: ๊ธฐ์กด ์ฝ๋๋ฅผ ๋ชจ๋๋ก ๋ฆฌํฉํ ๋งํ๊ธฐ ์์ํฉ๋๋ค. ์๊ณ ๋ ๋ฆฝ์ ์ธ ๋ชจ๋์ ๋จผ์ ์ง์คํ์ธ์.
- ๋จ์ ํ ์คํธ ์์ฑ: ๊ฐ ๋ชจ๋์ ๋ํ ๋จ์ ํ ์คํธ๋ฅผ ์์ฑํ์ฌ ๋ง์ด๊ทธ๋ ์ด์ ํ์๋ ์ฌ๋ฐ๋ฅด๊ฒ ์๋ํ๋์ง ํ์ธํฉ๋๋ค. ์ด๋ ํ๊ท(regression)๋ฅผ ๋ฐฉ์งํ๋ ๋ฐ ๋งค์ฐ ์ค์ํฉ๋๋ค.
- ํ ๋ฒ์ ํ๋์ ๋ชจ๋ ๋ง์ด๊ทธ๋ ์ด์ : ํ ๋ฒ์ ํ๋์ ๋ชจ๋์ ๋ง์ด๊ทธ๋ ์ด์ ํ๊ณ , ๊ฐ ๋ง์ด๊ทธ๋ ์ด์ ํ์ ์ฒ ์ ํ ํ ์คํธํฉ๋๋ค.
- ํตํฉ ํ ์คํธ: ๊ด๋ จ๋ ๋ชจ๋ ๊ทธ๋ฃน์ ๋ง์ด๊ทธ๋ ์ด์ ํ ํ, ์ด๋ค ๊ฐ์ ํตํฉ์ ํ ์คํธํ์ฌ ์ฌ๋ฐ๋ฅด๊ฒ ํจ๊ป ์๋ํ๋์ง ํ์ธํฉ๋๋ค.
- ๋ฐ๋ณต: ์ ์ฒด ์ฝ๋๋ฒ ์ด์ค๊ฐ ๋ง์ด๊ทธ๋ ์ด์ ๋ ๋๊น์ง 5-8๋จ๊ณ๋ฅผ ๋ฐ๋ณตํฉ๋๋ค.
๋๊ตฌ ๋ฐ ๊ธฐ์
์๋ฐ์คํฌ๋ฆฝํธ ๋ชจ๋ ๋ง์ด๊ทธ๋ ์ด์ ์ ์ง์ํ๋ ์ฌ๋ฌ ๋๊ตฌ์ ๊ธฐ์ ์ด ์์ต๋๋ค:
- Webpack: ๋ธ๋ผ์ฐ์ ์์ ์ฌ์ฉํ๊ธฐ ์ํด ๋ค์ํ ํ์(ESM, CJS, AMD)์ ๋ชจ๋์ ๋ฒ๋ค๋งํ ์ ์๋ ๊ฐ๋ ฅํ ๋ชจ๋ ๋ฒ๋ค๋ฌ์ ๋๋ค.
- Rollup: ํนํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ํ ๊ณ ๋๋ก ์ต์ ํ๋ ๋ฒ๋ค์ ์์ฑํ๋ ๋ฐ ํนํ๋ ๋ชจ๋ ๋ฒ๋ค๋ฌ์ ๋๋ค. ํธ๋ฆฌ ์์ดํน์ ๋ฐ์ด๋ฉ๋๋ค.
- Parcel: ์ฌ์ฉํ๊ธฐ ์ฝ๊ณ ๋น ๋ฅธ ๋น๋ ์๊ฐ์ ์ ๊ณตํ๋ ์ ๋ก ๊ตฌ์ฑ(zero-configuration) ๋ชจ๋ ๋ฒ๋ค๋ฌ์ ๋๋ค.
- Babel: ์ต์ ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋(ES ๋ชจ๋ ํฌํจ)๋ฅผ ๊ตฌํ ๋ธ๋ผ์ฐ์ ์ ํธํ๋๋ ์ฝ๋๋ก ๋ณํํ ์ ์๋ ์๋ฐ์คํฌ๋ฆฝํธ ์ปดํ์ผ๋ฌ์ ๋๋ค.
- ESLint: ์ฝ๋ ์คํ์ผ์ ๊ฐ์ ํ๊ณ ์ ์ฌ์ ์ธ ์ค๋ฅ๋ฅผ ์๋ณํ๋ ๋ฐ ๋์์ด ๋๋ ์๋ฐ์คํฌ๋ฆฝํธ ๋ฆฐํฐ(linter)์ ๋๋ค. ESLint ๊ท์น์ ์ฌ์ฉํ์ฌ ๋ชจ๋ ๊ท์น์ ๊ฐ์ ํ์ธ์.
- TypeScript: ์ ์ ํ์ดํ์ ์ถ๊ฐํ๋ ์๋ฐ์คํฌ๋ฆฝํธ์ ์์ ์งํฉ์ ๋๋ค. TypeScript๋ ๊ฐ๋ฐ ํ๋ก์ธ์ค ์ด๊ธฐ์ ์ค๋ฅ๋ฅผ ํฌ์ฐฉํ๊ณ ์ฝ๋ ์ ์ง๋ณด์์ฑ์ ํฅ์์ํค๋ ๋ฐ ๋์์ด ๋ ์ ์์ต๋๋ค. ์ ์ง์ ์ผ๋ก TypeScript๋ก ๋ง์ด๊ทธ๋ ์ด์ ํ๋ฉด ๋ชจ๋ํ๋ ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ํฅ์์ํฌ ์ ์์ต๋๋ค.
- Dependency Cruiser: ์๋ฐ์คํฌ๋ฆฝํธ ์์กด์ฑ์ ์๊ฐํํ๊ณ ๋ถ์ํ๋ ๋๊ตฌ์ ๋๋ค.
- SonarQube: ์งํ ์ํฉ์ ์ถ์ ํ๊ณ ์ ์ฌ์ ์ธ ๋ฌธ์ ๋ฅผ ์๋ณํ๊ธฐ ์ํด ์ฝ๋ ํ์ง์ ์ง์์ ์ผ๋ก ๊ฒ์ฌํ๋ ํ๋ซํผ์ ๋๋ค.
์์ : ๊ฐ๋จํ ํจ์ ๋ง์ด๊ทธ๋ ์ด์ ํ๊ธฐ
utils.js๋ผ๋ ๋ ๊ฑฐ์ ์๋ฐ์คํฌ๋ฆฝํธ ํ์ผ์ ๋ค์๊ณผ ๊ฐ์ ์ฝ๋๊ฐ ์๋ค๊ณ ๊ฐ์ ํด ๋ณด๊ฒ ์ต๋๋ค:
// utils.js
function add(a, b) {
return a + b;
}
function subtract(a, b) {
return a - b;
}
// Make functions globally available
window.add = add;
window.subtract = subtract;
์ด ์ฝ๋๋ add์ subtract ํจ์๋ฅผ ์ ์ญ์ ์ผ๋ก ์ฌ์ฉํ ์ ์๊ฒ ๋ง๋๋๋ฐ, ์ด๋ ์ผ๋ฐ์ ์ผ๋ก ๋์ ๊ดํ์ผ๋ก ๊ฐ์ฃผ๋ฉ๋๋ค. ์ด ์ฝ๋๋ฅผ ES ๋ชจ๋๋ก ๋ง์ด๊ทธ๋ ์ด์
ํ๋ ค๋ฉด, utils.module.js๋ผ๋ ์ ํ์ผ์ ๋ง๋ค๊ณ ๋ค์ ์ฝ๋๋ฅผ ์ถ๊ฐํ๋ฉด ๋ฉ๋๋ค:
// utils.module.js
export function add(a, b) {
return a + b;
}
export function subtract(a, b) {
return a - b;
}
์ด์ ๋ฉ์ธ ์๋ฐ์คํฌ๋ฆฝํธ ํ์ผ์์ ์ด ํจ์๋ค์ ๊ฐ์ ธ์ฌ ์ ์์ต๋๋ค:
// main.js
import { add, subtract } from './utils.module.js';
console.log(add(2, 3)); // Output: 5
console.log(subtract(5, 2)); // Output: 3
๋ํ utils.js์์ ์ ์ญ ํ ๋น์ ์ ๊ฑฐํด์ผ ํฉ๋๋ค. ๋ ๊ฑฐ์ ์ฝ๋์ ๋ค๋ฅธ ๋ถ๋ถ์ด ์ ์ญ add ๋ฐ subtract ํจ์์ ์์กดํ๋ ๊ฒฝ์ฐ, ๋ชจ๋์์ ํจ์๋ฅผ ๊ฐ์ ธ์ค๋๋ก ํด๋น ์ฝ๋๋ฅผ ์
๋ฐ์ดํธํด์ผ ํฉ๋๋ค. ์ ์ง์ ๋ง์ด๊ทธ๋ ์ด์
๋จ๊ณ์์๋ ์์ ์ฌ(shim)์ด๋ ๋ํผ ํจ์๊ฐ ํ์ํ ์ ์์ต๋๋ค.
๋ชจ๋ฒ ์ฌ๋ก
๋ ๊ฑฐ์ ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋๋ฅผ ์ต์ ๋ชจ๋๋ก ๋ง์ด๊ทธ๋ ์ด์ ํ ๋ ๋ฐ๋ผ์ผ ํ ๋ช ๊ฐ์ง ๋ชจ๋ฒ ์ฌ๋ก๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- ์๊ฒ ์์ํ๊ธฐ: ๋ง์ด๊ทธ๋ ์ด์ ํ๋ก์ธ์ค์ ๋ํ ๊ฒฝํ์ ์๊ธฐ ์ํด ์๊ณ ๋ ๋ฆฝ์ ์ธ ๋ชจ๋๋ถํฐ ์์ํ์ธ์.
- ๋จ์ ํ ์คํธ ์์ฑ: ๊ฐ ๋ชจ๋์ ๋ํ ๋จ์ ํ ์คํธ๋ฅผ ์์ฑํ์ฌ ๋ง์ด๊ทธ๋ ์ด์ ํ์๋ ์ฌ๋ฐ๋ฅด๊ฒ ์๋ํ๋์ง ํ์ธํ์ธ์.
- ๋น๋ ๋๊ตฌ ์ฌ์ฉ: ๋ธ๋ผ์ฐ์ ์์ ์ฌ์ฉํ๊ธฐ ์ํด ๋ชจ๋์ ๋ฒ๋ค๋งํ๋ ๋น๋ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ธ์.
- ํ๋ก์ธ์ค ์๋ํ: ์คํฌ๋ฆฝํธ์ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ๋ฅํ ํ ๋ง์ ๋ง์ด๊ทธ๋ ์ด์ ํ๋ก์ธ์ค๋ฅผ ์๋ํํ์ธ์.
- ํจ๊ณผ์ ์ธ ์์ฌ์ํต: ํ์๋ค์๊ฒ ์งํ ์ํฉ๊ณผ ์ง๋ฉดํ ๋ฌธ์ ์ ๋ํด ๊ณ์ ์๋ ค์ฃผ์ธ์.
- ๊ธฐ๋ฅ ํ๋๊ทธ ๊ณ ๋ ค: ๋ง์ด๊ทธ๋ ์ด์ ์ด ์งํ๋๋ ๋์ ์๋ก์ด ๋ชจ๋์ ์กฐ๊ฑด๋ถ๋ก ํ์ฑํ/๋นํ์ฑํํ๊ธฐ ์ํด ๊ธฐ๋ฅ ํ๋๊ทธ๋ฅผ ๊ตฌํํ์ธ์. ์ด๋ ์ํ์ ์ค์ด๊ณ A/B ํ ์คํธ๋ฅผ ๊ฐ๋ฅํ๊ฒ ํ๋ ๋ฐ ๋์์ด ๋ ์ ์์ต๋๋ค.
- ํ์ ํธํ์ฑ: ํ์ ํธํ์ฑ์ ์ผ๋์ ๋์ธ์. ๋ณ๊ฒฝ ์ฌํญ์ด ๊ธฐ์กด ๊ธฐ๋ฅ์ ์์์ํค์ง ์๋๋ก ํ์ธ์.
- ๊ตญ์ ํ ๊ณ ๋ ค์ฌํญ: ์ ํ๋ฆฌ์ผ์ด์ ์ด ์ฌ๋ฌ ์ธ์ด ๋๋ ์ง์ญ์ ์ง์ํ๋ ๊ฒฝ์ฐ, ๋ชจ๋์ด ๊ตญ์ ํ(i18n) ๋ฐ ํ์งํ(l10n)๋ฅผ ์ผ๋์ ๋๊ณ ์ค๊ณ๋์๋์ง ํ์ธํฉ๋๋ค. ์ฌ๊ธฐ์๋ ํ ์คํธ ์ธ์ฝ๋ฉ, ๋ ์ง/์๊ฐ ํ์ ๋ฐ ํตํ ๊ธฐํธ๋ฅผ ์ฌ๋ฐ๋ฅด๊ฒ ์ฒ๋ฆฌํ๋ ๊ฒ์ด ํฌํจ๋ฉ๋๋ค.
- ์ ๊ทผ์ฑ ๊ณ ๋ ค์ฌํญ: ๋ชจ๋์ด WCAG ๊ฐ์ด๋๋ผ์ธ์ ๋ฐ๋ผ ์ ๊ทผ์ฑ์ ์ผ๋์ ๋๊ณ ์ค๊ณ๋์๋์ง ํ์ธํฉ๋๋ค. ์ฌ๊ธฐ์๋ ์ ์ ํ ARIA ์์ฑ, ์๋งจํฑ HTML ๋ฐ ํค๋ณด๋ ํ์ ์ง์ ์ ๊ณต์ด ํฌํจ๋ฉ๋๋ค.
์ผ๋ฐ์ ์ธ ๋ฌธ์ ํด๊ฒฐํ๊ธฐ
๋ง์ด๊ทธ๋ ์ด์ ๊ณผ์ ์์ ์ฌ๋ฌ ๋ฌธ์ ์ ์ง๋ฉดํ ์ ์์ต๋๋ค:
- ์ ์ญ ๋ณ์: ๋ ๊ฑฐ์ ์ฝ๋๋ ์ข ์ข ์ ์ญ ๋ณ์์ ์์กดํ๋๋ฐ, ์ด๋ ๋ชจ๋ ํ๊ฒฝ์์ ๊ด๋ฆฌํ๊ธฐ ์ด๋ ค์ธ ์ ์์ต๋๋ค. ์ ์ญ ๋ณ์๋ฅผ ํผํ๊ธฐ ์ํด ์์กด์ฑ ์ฃผ์ ์ด๋ ๋ค๋ฅธ ๊ธฐ์ ์ ์ฌ์ฉํ๋๋ก ์ฝ๋๋ฅผ ๋ฆฌํฉํ ๋งํด์ผ ํฉ๋๋ค.
- ์ํ ์์กด์ฑ: ์ํ ์์กด์ฑ์ ๋ ์ด์์ ๋ชจ๋์ด ์๋ก ์์กดํ ๋ ๋ฐ์ํฉ๋๋ค. ์ด๋ ๋ชจ๋ ๋ก๋ฉ ๋ฐ ์ด๊ธฐํ์ ๋ฌธ์ ๋ฅผ ์ผ์ผํฌ ์ ์์ต๋๋ค. ์ํ ์์กด์ฑ์ ๊นจ๊ธฐ ์ํด ์ฝ๋๋ฅผ ๋ฆฌํฉํ ๋งํด์ผ ํฉ๋๋ค.
- ํธํ์ฑ ๋ฌธ์ : ๊ตฌํ ๋ธ๋ผ์ฐ์ ๋ ์ต์ ๋ชจ๋ ์์คํ ์ ์ง์ํ์ง ์์ ์ ์์ต๋๋ค. ๊ตฌํ ๋ธ๋ผ์ฐ์ ์์ ํธํ์ฑ์ ๋ณด์ฅํ๊ธฐ ์ํด ๋น๋ ๋๊ตฌ์ ๋ชจ๋ ๋ก๋๋ฅผ ์ฌ์ฉํด์ผ ํฉ๋๋ค.
- ์ฑ๋ฅ ๋ฌธ์ : ๋ชจ๋๋ก ๋ง์ด๊ทธ๋ ์ด์ ํ๋ ๊ฒ์ ์ ์คํ๊ฒ ์ํํ์ง ์์ผ๋ฉด ๋๋๋ก ์ฑ๋ฅ ๋ฌธ์ ๋ฅผ ์ผ์ผํฌ ์ ์์ต๋๋ค. ์ฝ๋ ๋ถํ ๊ณผ ํธ๋ฆฌ ์์ดํน์ ์ฌ์ฉํ์ฌ ๋ฒ๋ค์ ์ต์ ํํ์ธ์.
๊ฒฐ๋ก
๋ ๊ฑฐ์ ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋๋ฅผ ์ต์ ๋ชจ๋๋ก ๋ง์ด๊ทธ๋ ์ด์ ํ๋ ๊ฒ์ ์๋นํ ๋ ธ๋ ฅ์ด์ง๋ง, ์ฝ๋ ๊ตฌ์ฑ, ์ฌ์ฌ์ฉ์ฑ, ์ ์ง๋ณด์์ฑ ๋ฐ ์ฑ๋ฅ ์ธก๋ฉด์์ ์๋นํ ์ด์ ์ ์ป์ ์ ์์ต๋๋ค. ๋ง์ด๊ทธ๋ ์ด์ ์ ๋ต์ ์ ์คํ๊ฒ ๊ณํํ๊ณ , ์ฌ๋ฐ๋ฅธ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ๋ฉฐ, ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ๋ฐ๋ฅด๋ฉด ์ฝ๋๋ฒ ์ด์ค๋ฅผ ์ฑ๊ณต์ ์ผ๋ก ํ๋ํํ๊ณ ์ฅ๊ธฐ์ ์ผ๋ก ๊ฒฝ์๋ ฅ์ ์ ์งํ ์ ์์ต๋๋ค. ๋ง์ด๊ทธ๋ ์ด์ ์ ๋ต์ ์ ํํ ๋ ํน์ ํ๋ก์ ํธ ์๊ตฌ ์ฌํญ, ํ ๊ท๋ชจ, ์์ฉํ ์ ์๋ ์ํ ์์ค์ ๊ณ ๋ คํ๋ ๊ฒ์ ์์ง ๋ง์ญ์์ค. ์ ์คํ ๊ณํ๊ณผ ์คํ์ ํตํด ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋๋ฒ ์ด์ค๋ฅผ ํ๋ํํ๋ ๊ฒ์ ์์ผ๋ก ๋ช ๋ ๋์ ๊ทธ๋งํ ๊ฐ์น๋ฅผ ํ ๊ฒ์ ๋๋ค.